#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#include <stdio.h>
#include <stdlib.h>

#define MYPORT      4000    // 用户连接的端口号
#define BACKLOG     10      // 等待队列中可以存储多少个未经过accept处理的连接

int main(int argc, char const *argv[])
{
    int sockfd, new_fd; // 监听网络连接的套接字sock_fd，用户炼乳的套接字位new_fd

    int bind_check, listen_check;

    struct sockaddr_in my_addr; // 本地的地址信息

    struct sockaddr_in their_addr; // 连接者的地址信息
    
    int sin_size;

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket failed");
        exit(1);
    }

    my_addr.sin_family = AF_INET;

    my_addr.sin_port = htons(MYPORT);       // 网络字节顺序，短整型

    my_addr.sin_addr.s_addr = INADDR_ANY;   //自动复制为自己的IP

    bzero(&(my_addr.sin_zero), 8);          // 将结构中未使用的部分设置为0

    
    if((bind_check = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr))) == -1) {
        perror("bind failed");
        exit(1);
    }

    if(listen_check = listen(sockfd, BACKLOG) == -1) {
        perror("listen failed");
        exit(1);
    }

    sin_size = sizeof(struct sockaddr_in);

    new_fd = accept(sockfd, &their_addr, &sin_size);

    // 如果只想获得一个单独的连接，可以将原来的sock_fd关掉
    shutdown(sockfd, 2); // 2 == 不允许以后的任何读写操作
    shutdown(new_fd, 2);
    
    return 0;
}
